#ifndef LISTCOMP_H
#define LISTCOMP_H

#include <string>
#include <vector>

using namespace std;

/**
 * Permet de gérer le type de compétence.
 */
enum ScoreAdditionnel {
  Normal,      /**< Compétence "normale", pouvant être associée à un
		  pourcentage */
  Basique,    /**< Compétence associée à un nombre dépendant du
		 niveau */
  Pourcentage /**< Compétence associée à un pourcentage dépendant du
		 niveau */
};

/**
 * Gestion des compétences de classe. Permet d'associer le nom de la
 * compétence à un coût, un éventuel pourcentage de base et permet de
 * préciser si la compétence est associée à un autre score, dépendant
 * du niveau. En faire une classe permet de jouir des mêmes avantages
 * que pour ListCapa.
 */
class ListComp
{
 public:
  ListComp(const string& comp = "", const unsigned int& prix = 0,
	   const ScoreAdditionnel& autre = Normal);
  ListComp(const string& comp, const unsigned int& prix,
	   const bool& pourcentage, const unsigned int& valBase);
  ListComp(const string& comp, const unsigned int& prix,
	   const unsigned int& base, const vector< ListComp > *ptr,
	   const bool& exclu = false);
  ListComp(const ListComp& lsComp);
  ~ListComp();
  ListComp& operator=(const ListComp& lsComp);
  /**
   * Permet de réaliser l'affichage simple d'une ListComp. Le nom et
   * le coût sont affichés, et les éventuels autres attributs, tels
   * que le pourcentage de base, ou alors si elle est associée à un
   * score dépendant du niveau.
   *
   * @param os flot de sortie sur lequel on veut écrire.
   * @param lsComp capacité que l'on veut écrire.
   * @return le flot os, modifié.
   */
  friend ostream& operator<<(ostream& os, const ListComp& lsComp);
  string Comp;       /**< Nom de la compétence */
  unsigned int Cout; /**< Cout de la compétence en PP */
  bool Pourcentage;  /**< Associé à un pourcentage ? */
  unsigned int valeurBase; /**< Valeur de base d'une compétence
			      associée à un pourcentage (du type
			      talent de Voleur). */
  ScoreAdditionnel AutreScore; /**< Associé à un score dépendant du niveau ? */
  const vector< ListComp > *sousCategorie; /**< Tentative de résoudre
					le pb des talents de voleurs
					pour mages. */
  unsigned int adresseBase; /**< Offset appliqué à la compétence lors
			       du stockage dans
			       Classe::Comp_classe. */
  const bool& aSousCategorie() const;
  const bool& choixEstExclusif() const;
 private:
  bool aPointeur; /**< Sert à savoir si la compétence a un pointeur
		     sur un autre conteneur. */
  bool choixExclusif; /**< Sert à savoir si les compétences "dans le
			 tiroir" permettent un choix multiple ou
			 non. */
};

#endif // LISTCOMP_H
